﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
using Microsoft.Win32;
using System.IO;

namespace ZIPDemo
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        #region WinRAR解压缩类
        /// <summary>
        /// Description:WinRAR压缩 
        /// </summary>
        public class WinRARCSharp
        {
            // WinRAR安装注册表key    
            private const string WinRAR_KEY = @"WinRAR.ZIP\shell\open\command";
            /// <summary>
            /// 利用 WinRAR 进行压缩
            /// </summary>
            /// <param name="path">将要被压缩的文件夹（绝对路径）</param>
            /// <param name="rarPath">压缩后的 .rar 的存放目录（绝对路径）</param>
            /// <param name="rarName">压缩文件的名称（包括后缀）</param>
            /// <returns>true 或 false。压缩成功返回 true，反之，false。</returns>   
            public bool RAR(string path, string rarPath, string rarName)
            {
                bool flag = false;
                string rarexe;       //WinRAR.exe 的完整路径       
                RegistryKey regkey;  //注册表键       
                Object regvalue;     //键值        
                string cmd;          //WinRAR 命令参数       
                ProcessStartInfo startinfo;
                Process process;
                try
                {
                    regkey = Registry.ClassesRoot.OpenSubKey(WinRAR_KEY);
                    regvalue = regkey.GetValue("");  // 键值为 "d:\Program Files\WinRAR\WinRAR.exe" "%1"           
                    rarexe = regvalue.ToString();
                    regkey.Close();
                    rarexe = rarexe.Substring(1, rarexe.Length - 7);  // d:\Program Files\WinRAR\WinRAR.exe             
                    Directory.CreateDirectory(path);             //压缩命令，相当于在要压缩的文件夹(path)上点右键->WinRAR->添加到压缩文件->输入压缩文件名(rarName)            
                    cmd = string.Format("a {0} {1} -r", rarName, path);
                    startinfo = new ProcessStartInfo();
                    startinfo.FileName = rarexe;
                    startinfo.Arguments = cmd;                          //设置命令参数            
                    startinfo.WindowStyle = ProcessWindowStyle.Hidden;  //隐藏 WinRAR 窗口             
                    startinfo.WorkingDirectory = rarPath;
                    process = new Process();
                    process.StartInfo = startinfo;
                    process.Start();
                    process.WaitForExit(); //无限期等待进程 winrar.exe 退出            
                    if (process.HasExited)
                    {
                        flag = true;
                    }
                    process.Close();
                }
                catch (Exception e)
                {
                    throw e;
                }
                return flag;
            }
            /// <summary>
            /// 利用 WinRAR 进行解压缩     
            /// </summary>
            /// <param name="path">文件解压路径（绝对）</param>
            /// <param name="rarPath">将要解压缩的 .rar 文件的存放目录（绝对路径）</param>
            /// <param name="rarName">将要解压缩的 .rar 文件名（包括后缀）</param>
            /// <returns>true 或 false。解压缩成功返回 true，反之，false。</returns>    
            public bool UnRAR(string path, string rarPath, string rarName)
            {
                bool flag = false;
                string rarexe;
                RegistryKey regkey;
                Object regvalue;
                string cmd;
                ProcessStartInfo startinfo;
                Process process;
                try
                {
                    regkey = Registry.ClassesRoot.OpenSubKey(WinRAR_KEY);
                    regvalue = regkey.GetValue("");
                    rarexe = regvalue.ToString();
                    regkey.Close();
                    rarexe = rarexe.Substring(1, rarexe.Length - 7);
                    Directory.CreateDirectory(path);             //解压缩命令，相当于在要压缩文件(rarName)上点右键->WinRAR->解压到当前文件夹            
                    cmd = string.Format("x {0} {1} -y", rarName, path);
                    startinfo = new ProcessStartInfo();
                    startinfo.FileName = rarexe;
                    startinfo.Arguments = cmd;
                    startinfo.WindowStyle = ProcessWindowStyle.Hidden;
                    startinfo.WorkingDirectory = rarPath;
                    process = new Process();
                    process.StartInfo = startinfo;
                    process.Start();
                    process.WaitForExit();
                    if (process.HasExited)
                    {
                        flag = true;
                    }
                    process.Close();
                }
                catch (Exception e)
                {
                    throw e;
                }
                return flag;
            }
        }
        #endregion

        private void btnWinRAR_Click(object sender, EventArgs e)
        {
            WinRARCSharp win = new WinRARCSharp();
            //win.RAR("E:\\CodeDemo\\ZIPDemo\\ZIPDemo\\bin", "E:\\CodeDemo\\ZIPDemo\\ZIPDemo\\bin", "Debug.rar");// 压缩 
            if (win.UnRAR("E:\\CodeDemo\\ZIPDemo\\ZIPDemo\\bin\\", "E:\\CodeDemo\\ZIPDemo\\ZIPDemo\\bin\\Debug\\", "Debug.rar"))// 解压
            {
                File.Delete(@"E:\CodeDemo\ZIPDemo\ZIPDemo\bin\Debug\Debug.rar");
            }
            else
            {
                MessageBox.Show("未能解压成功");
            }
        }

    }
}
